package com.hsh.erp.domain.vo;

import com.hsh.erp.utils.DataUtils;
import com.hsh.erp.utils.DateUtils;
import lombok.Data;
import lombok.experimental.Accessors;
import org.apache.logging.log4j.util.Strings;

import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * @GetMapping("/list") outbound
 */
@Data
@Accessors(chain = true)
public class OutboundVO implements Serializable {
    /**
     *
     */
    private Integer id;

    /**
     * 出库类型id
     */
    private Integer typeId;

    /**
     * 出库编号（如果与订单绑定，出库编号=订单号）
     */
    private String no;

    /**
     * 0-未完成 1 -已完成 （同一个出入库编号的所有订单，所有商品的预计入库数量=所有订单的所有实际入库数量，才可以设置为已完成）
     */
    private Integer isFinish;

    /**
     * 商品id
     */
    private Integer productId;

    /**
     * 商品名称
     */
    private String productName;

    /**
     * 预计出库数量
     */
    private Integer planNum;

    /**
     * 实际出库数量（库存不足时，实际出库会<预计出库，需要手动补充）
     */
    private Integer actualNum;

    /**
     * 销售价格：分
     */
    private Integer priceCent;

    /**
     * 销售价格：元
     */
    private BigDecimal priceYuan;

    /**
     * 店铺id
     */
    private Integer shopId;

    /**
     * 店铺名称
     */
    private String shopName;

    /**
     * 仓库id
     */
    private Integer repositoryId;

    /**
     * 仓库名称
     */
    private String repositoryName;

    /**
     * 出入库时间
     */
    private LocalDateTime createTime;

    /**
     * 备注
     */
    private String note;

    /**
     * 是否删除 0-未删除 1-已删除
     */
    private Integer isDelete;


    /**
     * 开始时间
     */
    private String startTime;

    /**
     * 结束时间
     */
    private String endTime;

    /**
     * 查询时初始化参数
     *
     * @return
     */
    public OutboundVO selectInit() {
        this.no = DataUtils.removeSpaceAndSymbols(this.no);
        this.productName = DataUtils.removeSpaceAndSymbols(this.productName);
        return this;
    }


    /**
     * 添加时初始化参数
     *
     * @return
     */
    public OutboundVO addInit() {
        this.no = Strings.isBlank(this.no) ? DateUtils.getNowStr() : this.no;

        this.actualNum = this.actualNum == null ? 0 : this.actualNum;
        this.planNum = this.planNum == null ? this.actualNum : this.planNum;
        this.isFinish = this.planNum > this.actualNum ? 0 : 1;

        this.createTime = this.createTime == null ? LocalDateTime.now() : this.createTime;
        return this;
    }

    /**
     * 修改时初始化
     * @return
     */
    public OutboundVO updateInit() {
        if (this.planNum != null && this.actualNum != null) {
            this.isFinish = this.planNum > this.actualNum ? 0 : 1;
        }
        return this;
    }

}